package com.android.awacs.gsm;

import com.android.awacs.gps.GoogleMap;
import com.android.awacs.util.StringParser;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

import java.util.StringTokenizer;

// Service lance au lancement d'AWACS et en "alerte permanante" 
public class SmsMessageReceiver extends BroadcastReceiver {

	// Protocole de communication avec les boards Arduino
	public final String TAG_SMS = "SMS"; // reception d'un bete SMS
	public final String TAG_GPS = "GPS"; // reception de coordonnees GPS
	public final String TAG_THM = "THM"; // reception de donnees thermiques
	public final String TAG_DOO = "DOO"; // reception de porte ouverte ou non
	public final String TAG_LUM = "LUM"; // reception de la luminosite

	// Appel a la reception d'un SMS
	@Override
	public void onReceive(Context context, Intent intent) {
		// Sur reception d'un SMS (bundle)
		Bundle bundle = intent.getExtras();
		SmsMessage[] msgs = null;
		String str = ""; // pour le formatage/retour
		String contenu = ""; // pour le contenu du SMS
		String tag = ""; // pour le tag du SMS
		String origine = ""; // pour le numero de l'emetteur

		// Si le bundle n'est pas nul
		if (bundle != null) {
			Object[] pdus = (Object[]) bundle.get("pdus");
			msgs = new SmsMessage[pdus.length];

			// parsing du SMS
			for (int i = 0; i < msgs.length; i++) {
				msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
				origine += msgs[i].getOriginatingAddress();
				contenu += msgs[i].getMessageBody().toString();
			}

			int longueur = contenu.length();

			// Si le message est de trois caracteres ou plus
			if (longueur >= 3) {

				// Extraction du tag (3 premieres lettres) du message
				tag = contenu.substring(0, 3);

				// Si on a recu un tag "SMS"
				if (tag.compareToIgnoreCase(TAG_SMS) == 0) {

					// Juste le tag ou plus ?
					if (longueur > 3)
						// On sort le tag du message pour garder le contenu brut
						contenu = contenu.substring(4, longueur);
					else
						contenu = "Test de la fonction SMS !";
					str += "SMS de " + origine + " : " + contenu;
					Toast.makeText(context, str, Toast.LENGTH_LONG).show();
				}

				// Si on a recu un tag "GPS"
				if (tag.compareToIgnoreCase(TAG_GPS) == 0) {

					// on cree une intent et un bundle a remplir
					Intent i = new Intent(context, GoogleMap.class);
					Bundle b = new Bundle();

					// Juste le tag ou plus ?
					if (longueur > 3) {
						// On sort le tag du message pour garder le contenu brut
						contenu = contenu.substring(4, longueur);
						StringParser parse = new StringParser();
						parse.GPS(contenu, b);
					}
					// si juste "gps", contenu par defaut
					else {
						b.putString("Latitude", "5.518889");
						b.putString("Longitude", "-87.071667");
						b.putString("Localisation", "Jurassic Park");
						b.putString("Model", "Il a fallu 65 millions d'années pour que cette aventure devienne possible");
					}
					// on remplit le bundle avec tout ca, et on l'envoie
					i.putExtras(b);
					i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					context.startActivity(i);
				}

				// Si on a recu un tag "THM"
				if (tag.compareToIgnoreCase(TAG_THM) == 0) {

					// Juste le tag ou plus ?
					if (longueur > 3)
						// On sort le tag du message pour garder le contenu brut
						contenu = contenu.substring(4, longueur);
					else
						contenu = "Test de la fonction thermomètre !";
					str += "Température : " + contenu + "°C";
					Toast.makeText(context, str, Toast.LENGTH_LONG).show();
				}

				// Si on a recu un tag "DOO"
				if (tag.compareToIgnoreCase(TAG_DOO) == 0) {

					// Juste le tag ou plus ?
					if (longueur > 3)
						// On sort le tag du message pour garder le contenu brut
						contenu = contenu.substring(4, longueur);
					else
						contenu = "Test de la fonction porte !";

					str += "Etat de la porte : " + contenu;
					Toast.makeText(context, str, Toast.LENGTH_LONG).show();
				}

				// Si on a recu un tag "LUM"
				if (tag.compareToIgnoreCase(TAG_LUM) == 0) {

					// Juste le tag ou plus ?
					if (longueur > 3)
						// On sort le tag du message pour garder le contenu brut
						contenu = contenu.substring(4, longueur);
					else
						contenu = "Test de la fonction luminosité !";
					str += "Luminosité : " + contenu + "%";
					Toast.makeText(context, str, Toast.LENGTH_LONG).show();
				}
			}
		}
	}
}